/*  Copyright (C) 2009 Jos van der Til
    
    This file is part of the Fluent Metadata Library.

    The Fluent Metadata Library is free software: you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    The Fluent Metadata Library is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Lesser General Public License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with the Fluent Metadata Library.  If not, see <http://www.gnu.org/licenses/>.
 */
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using FluentMetadata.AttributeBuilders;

namespace FluentMetadata
{
    public class FluentMetadata
    {
        public IDictionary<string, IList<IBaseAttributeBuilder>> AttributeBuilders;

        internal FluentMetadata()
        {
            AttributeBuilders = new Dictionary<string, IList<IBaseAttributeBuilder>>();
        }
    }

    public class FluentMetadata<TEntity> : FluentMetadata where TEntity : class
    {
        public IBaseAttributeBuilder ForProperty<TProperty>(Expression<Func<TEntity, TProperty>> expression)
        {
            string member = ((MemberExpression) expression.Body).Member.Name;

            var attributeBuilder = new BaseAttributeBuilder();

            if (!AttributeBuilders.ContainsKey(member))
            {
                var list = new List<IBaseAttributeBuilder>();
                list.Add(attributeBuilder);

                AttributeBuilders.Add(member, list);
            }
            else
            {
                IList<IBaseAttributeBuilder> list = AttributeBuilders[member];
                list.Add(attributeBuilder);
            }

            return attributeBuilder;
        }
    }
}